在金融產品裡,貸款攤還(amortization) 是非常常見的需求。無論是房貸、車貸或是分期付款,等額本息(每月繳同樣金額)是最常見的還款方式。今天我們把公式寫成 Python 函數,讓你能算出每月應繳、每期本金與利息分攤,並輸出一張清楚的攤還表,幫你回答:「我每月到底要還多少?總利息多少?」
今天目標:
- 理解等額本息公式的概念
- 用簡單的 Python 產出攤還表與總利息
- 產出 CSV(方便放入作品集或上傳到 Excel)
等額本息的每月繳款金額是固定的,但每月裡面「利息」隨剩餘本金變少而下降,「本金」成分則逐期增加。總利息 = 每月繳款 × 期數 − 貸款本金。
import csv
def monthly_payment(principal, annual_rate, years):
"""計算每月固定還款(等額本息)
annual_rate 輸入小數,例如 5% -> 0.05
"""
n = int(years * 12)
if annual_rate == 0:
return principal / n
r = annual_rate / 12.0
return principal * (r * (1 + r) ** n) / (((1 + r) ** n) - 1)
def amortization_schedule(principal, annual_rate, years):
monthly = monthly_payment(principal, annual_rate, years)
n = int(years * 12)
balance = principal
schedule = []
for i in range(1, n + 1):
interest = balance * (annual_rate / 12.0)
principal_paid = monthly - interest
# 最後一期為避免浮點誤差,將剩餘本金一次還清
if i == n:
principal_paid = balance
monthly = interest + principal_paid
balance = balance - principal_paid
schedule.append({
"期數": i,
"每期應繳": round(monthly, 2),
"利息": round(interest, 2),
"本金": round(principal_paid, 2),
"剩餘本金": round(balance if balance>0 else 0.0, 2)
})
total_paid = sum(row["每期應繳"] for row in schedule)
total_interest = round(total_paid - principal, 2)
return schedule, round(monthly, 2), total_interest
# 範例:貸款 1,000,000 元,年利率 2.0%,期數 20 年
P = 1_000_000
annual_rate = 0.02 # 2%
years = 20
schedule, monthly_fixed, total_interest = amortization_schedule(P, annual_rate, years)
print(f"貸款本金:{P:,} 元,年利率:{annual_rate*100:.2f}% ,期數:{years} 年")
print(f"每月應繳:{monthly_fixed:,.2f} 元")
print(f"總利息(估):{total_interest:,.2f} 元")
print("\n前 5 期攤還明細:")
for row in schedule[:5]:
print(row)
# 可選:把完整攤還表存成 CSV
with open("amortization.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["期數","每期應繳","利息","本金","剩餘本金"])
writer.writeheader()
writer.writerows(schedule)
print("\n已將完整攤還表輸出為 amortization.csv")